home *** CD-ROM | disk | FTP | other *** search
- /*******************************************************************************
- +
- + LEDA 2.1.1 11-15-1991
- +
- +
- + d_array.h
- +
- +
- + Copyright (c) 1991 by Max-Planck-Institut fuer Informatik
- + Im Stadtwald, 6600 Saarbruecken, FRG
- + All rights reserved.
- +
- *******************************************************************************/
-
-
-
-
- //------------------------------------------------------------------------------
- // d_array
- //
- // Stefan Naeher (1989)
- //------------------------------------------------------------------------------
-
- #ifndef DARRAYH
- #define DARRAYH
-
- #ifndef RBTREEH
- #include <LEDA/rb_tree.h>
- #endif
-
- #define d_array(itype,etype) name3(itype,etype,d_array)
-
- #define d_arraydeclare2(itype,etype)\
- \
- struct d_array(itype,etype) : public rb_tree {\
- \
- etype init;\
- rb_tree_node* iterator;\
- \
- int cmp(ent& x, ent& y) const { return compare(*(itype*)&x,*(itype*)&y); }\
- void clear_key(ent& x) const { Clear(*(itype*)&x); }\
- void clear_inf(ent& x) const { Clear(*(etype*)&x); }\
- void copy_key(ent& x) const { Copy(*(itype*)&x); }\
- void copy_inf(ent& x) const { Copy(*(etype*)&x); }\
- \
- etype& operator[](itype y) { rb_tree_node* i=rb_tree::lookup(Ent(y));\
- if (i==nil) i=rb_tree::insert(Ent(y),Ent(init));\
- return *(etype*)&rb_tree::info(i); }\
- /*\
- etype operator[](itype y) const\
- { rb_tree_node* i=rb_tree::lookup(Ent(y));\
- if (i==nil) return init;\
- else return etype(rb_tree::info(i)); }\
- */\
- bool defined(itype y) const { return (rb_tree::lookup(Ent(y))!=nil); }\
- void init_iterator() { iterator = rb_tree::first_item(); }\
- bool next_index(itype& y) { if (iterator==0) return false;\
- else { void* p = rb_tree::key(iterator);\
- y = *(itype*)&p;\
- iterator = rb_tree::next_item(iterator);\
- return true; } \
- }\
- \
- d_array(itype,etype)() {};\
- d_array(itype,etype)(etype i) { init=i; }\
- \
- d_array(itype,etype)(const d_array(itype,etype)& A) : rb_tree((rb_tree&) A)\
- { init=A.init; }\
- \
- d_array(itype,etype)& operator=(const d_array(itype,etype)& A)\
- { rb_tree::operator=((rb_tree&)A); init=A.init; return *this; }\
- \
- ~d_array(itype,etype)() { clear(); };\
- } ;
-
- #define forall_defined(i,A) for ((A).init_iterator(); (A).next_index(i); )
-
-
- #endif
-